<?php
/**
 * Classe che svolge la funzione di creare un nuovo componente di tipo 'Dialog'.
 * Il componente puo' essere usato per varie funzionalita':
 * 
 * - Creare il componente completo di DIV e SCRIPT
 * - Creare il DIV che conterra' il contenuto della Dialog
 * - Creare lo SCRIPT che creera' la Dialog
 *
 * @author Damiano Ciarla
 */
class Dialog
{
    protected $title		= null;
	protected $divName		= null;
	protected $width		= 400;
	protected $height		= 400;
	protected $resizable	= false;
	protected $autoOpen		= false;
	protected $action		= array();
	protected $buttonOpen	= array();

	protected $createdButtonScript	= false;
	protected $createdButton		= false;

	protected $errorOccured	= false;

	/* Action di default per le azioni comuni */

	const CLOSE		= "Close";
	const CUSTOM	= "Custom";
	
	private $actionPermised = array("Close", "Custom");
	
	/**
	 * Inizializzazione dei parametri base utili alla creazione della Dialog
	 * 
	 * @param string $divName		Nome ID della Dialog
	 * @param int $width			Larghezza
	 * @param int $height			Altezza
	 * @param boolean $resizable	Indica la possibilita' che la dialog possa essere ridimensionata
	 */
	
	public function __construct($divName, $width = 400, $height = 400, $resizable = false)
	{
		$this->divName = $divName;
		
		if(is_int($width) && $width > 0) $this->width = $width;
		if(is_int($height) && $height > 0) $this->height = $height;
		if(is_bool($resizable))	$this->resizable = $resizable;
	}
	
	public function setTitle($title)
	{
		$this->title = $title;
	}

	public function setDivName($divName)
	{
		$this->divName = $divName;
	}

	public function setWidth($width)
	{
		if(is_int($width) && $width > 0) $this->width = $width;
	}

	public function setHeight($height)
	{
		if(is_int($height) && $height > 0) $this->height = $height;
	}

	public function setResizable($resizable)
	{
		if(is_bool($resizable))	$this->resizable = $resizable;
	}

	public function setAutoOpen($autoOpen)
	{
		if(is_bool($autoOpen)) $this->autoOpen = $autoOpen;
	}

	/**
	 * Metodo che imposta le azioni personalizzate in base alla chimata di callback
	 *
	 * @param string $name			Nome dell'azione. Scegliere una delle costanti presenti in questa classe
	 * @param string $label			Etichetta del pulsante all'interno della dialog
	 * @param string $personalized	Funzione di callback da chiamare quando si clicca sul pulsante generato
	 */

	public function setAction($name, $label = null, $personalized = null)
	{
		if(in_array($name, $this->actionPermised))
		{
			$this->action[] = array("NAME"=>$name, "LABEL"=>$label, "CALLBACK"=>$personalized);	
		}
	}

	/**
	 * Funzione che imposta i valori per il pulsante usato per l'apertura della Dialog
	 *
	 * @param string $label			Etichetta per il pulsante.
	 * @param boolean $autoShow		Mostra o meno il pulsante alla creazione della Dialog. Di Default è impostato per non essere mostrato
	 * @param string $style			Stile css per il pulsante. Di default è impostato 'button'
	 */

	public function setButtonOpen($label, $autoShow = false, $style = "button")
	{
		$this->buttonOpen['DATA'] = array("LABEL"=>$label, "AUTOSHOW"=>$autoShow, "STYLE"=>$style);
	}

	/*** -------------------- *** METODI PER LA STAMPA DEI CONTENUTI *** -------------------- ***/
	
	/**
	 * Funzione per la stampa del PULSANTE usato esclusivamente per 
	 * l'apertura della Dialog Box
	 */

	public function showButtonOpen()
	{
		if(!$this->errorOccured)
		{
			$this->createdButton = true;

			HtmlComponents::button(HtmlComponents::BUT_TYPE_BUTTON, $this->buttonOpen['DATA']['LABEL'], HtmlComponents::NEW_WIN, "buttuonOpen_" . $this->divName);

			if($this->createdButtonScript)
			{
				echo $this->autogenerateScriptButtonConfig();
			}
		}
	}
	
	/**
	 * Metodo che stampa il pulsante e lo script per gestire la Dialog
	 */
	
	public function showButtonAndScriptOnly()
	{
		$this->showButtonOpen();
		echo $this->autogenerateScriptConfig();
	}

	/**
	 * Funzione che stampa il necessario per lavorare con la Dialog Box.
	 * In dettaglio viene prodotto il DIV settato con i parametri divName e title
	 * e viene generato lo script che trasformerà il DIV in una Dialog
	 */

	public function showDialogAndScriptOnly()
	{
		echo "<div id='" . $this->divName . "' title='" . $this->title . "'></div>";
		echo $this->autogenerateScriptConfig();
	}

	public function showAllParts()
	{
		echo "<div id='" . $this->divName . "' title='" . $this->title . "'></div>";
		$this->showButtonOpen();
		echo $this->autogenerateScriptConfig();
	}
	
	public function showDialogStartDiv()
	{
		echo "<div id='" . $this->divName . "' title='" . $this->title . "'>";
	}
	
	public function showDialogEndDiv()
	{
		echo "</div>";
	}
	
	/*** -------------------- *** METODI PER LA CREAZIONE DEGLI SCRIPT *** -------------------- ***/

	/**
	 * Funzione che genera automaticamente lo script per creare la Dialog Box
	 * prendendo i valori passati dal costruttore o settati successivamente
	 * tramite i SET dei vari parametri
	 *
	 * @return string Intero script per la gestione della Dialog Box
	 */
	
	public function autogenerateScriptConfig()
	{
		$script  = "<script type='text/javascript'>";
		$script .= "$(function(){ ";
		$script .= "$('#" . $this->divName . "').dialog({ ";
		$script .= "bgiframe: true, ";
		$script .= "autoOpen: " . Dialog::printBooleanString($this->autoOpen) . ", ";
		$script .= "resizable: " . Dialog::printBooleanString($this->resizable) . ", ";
		$script .= "height: " . $this->height . ", ";
		$script .= "width: " . $this->width . ", ";
		$script .= "modal: true";

		if(count($this->action) > 0)
		{
			$script .= ", buttons: {";

			foreach ($this->action as $azione)
			{
				$function = "dialogAction" . $azione['NAME'];

				$script .= $this->$function($azione['LABEL'], $azione['CALLBACK']);

				if(!(end($this->action) == $azione))
				{
					$script .= ", ";
				}
			}

			$script .= "}";
		}

		$script .= "}); ";
		$script .= "});";

		$script .= "</script>";

		if($this->createdButton and !$this->createdButtonScript)
		{
			$script .= $this->autogenerateScriptButtonConfig();
		}

		return $script;
	}

	public function autogenerateScriptButtonConfig()
	{
		$this->createdButtonScript = true;

		$script  = "<script type='text/javascript'>";

		$script .= "$('#buttuonOpen_" . $this->divName . "').click(function(){ ";
		$script .= "$('#" . $this->divName . "').dialog('open'); ";
		$script .= "});";

		$script .= "</script>";

		return $script;
	}
	
	/*** -------------------- *** AZIONI PREIMPOSTATE *** -------------------- ***/
	
	/**
	 * Funzione con azione di default Preimpostata -> CLOSE
	 *
	 * @return string $action	Script per il pulsante di chiusura della Dialog
	 */

	public function dialogActionClose($callback = null)
	{
		$action  = "'" . TD_("Chiudi", "label") . "': function() {";
		$action .= "$(this).dialog('close');";
		$action .= "}";

		return $action;
	}

	/**
	 * Funzione con azione di default Preimpostata -> CLOSE
	 *
	 * @return string $action	Script per il pulsante di chiusura della Dialog
	 */

	public function dialogActionCustom($label, $callback = null)
	{
		$action  = "'" . $label . "': function() {";
		$action .= $callback . "()";
		$action .= "}";
		
		return $action;
	}

	/*** -------------------- *** METODI INTERNI *** -------------------- ***/

	/**
	 * Questo metodo ritorna il corrispondente valore in stringa del valore passato.
	 * Ad esempio se viene passato il valore NULL il metodo ritorna la stringa 'null'.
	 * Se non viene trovato un valore o nullo o booleano viene semplicemente restituita
	 * la stringa senza alcuna modifica
	 *
	 * @param bool $value	Valore che puo' essere booleano, nullo string o int
	 * @return string		Ritorna il corrispondente valore in stringa del valore passato
	 */

	protected static function printBooleanString($value)
	{
		if(is_null($value)) return "null";

		if(is_bool($value) && $value) return "true";

		if(is_bool($value) && !$value) return "false";

		return $value;
	}
}
?>
